package com.btb.adapter.model;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;

import com.btb.adapter.vo.request.UpChainQuery;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 *
 */
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Data
@ToString
public class UpChainHero {
    private Integer id;

    /**
     * 拥有者地址
     */
    private String owner;

    /**
     * 请求的批次ID
     */
    private String requestId;

    /**
     * 唯一id自增序列是，通常是数据库主键
     */
    private Integer clientId;

    /**
     * 唯一编号
     */
    private String sn;

    /**
     * 两位数字表示英雄的区域
1为亚洲
2为欧洲
3为非洲
4为北美洲
5为南美洲
6大洋洲

     */
    private Integer heroArea;

    /**
     * 两位数字表示的英雄品级
1为传奇
2为稀有
3为史诗
4为神话

     */
    private Integer grade;

    /**
     * 卡牌形象url全路径
     */
    private String cardImage;

    /**
     * 英雄名称
     */
    private String name;

    /**
     * 数字表示的赛季
1表示第一赛季
2表示第二赛季

     */
    private String season;

    /**
     * 英雄简介
     */
    private String cardTips;

    /**
     * 英雄战力值
     */
    private Long powerValue;

    /**
     * 英雄产生时的毫秒数
     */
    private Long productionDate;

    /**
     * 上链状态0未上链1上链中2中链待确认3上链成功4上链失败
     */
    private String status;

    /**
     * 上链如有错误时的错误描述
     */
    private String errDesc;

    /**
     * 上链操作transaction_hash
     */
    private String transactionHash;

    /**
     * 收到数据的时间戳 毫秒
     */
    private Long receiveTimestamp;

    /**
     * 开始上链的时间戳 毫秒
     */
    private Long startUpChainTimestamp;

    /**
     * 链上事件监听时间戳 毫秒
     */
    private Long eventUpChainTimestamp;

    /**
     * 收到事件时的区块高度
     */
    private Long blockNumber;

    /**
     * 上链操作使用的帐户
     */
    private String address;

    /**
     * 上链的gas费用
     */
    private BigDecimal gasUsed;

    /**
     * 推送检查结果
     */
    private String notifyCheckResult;

    /**
     * 调用远程确认时间
     */
    private Date notifyTime;

    /**
     * 已推送次数
     */
    private Integer notifyNum;

    /**
     * 调用远程确认时的区块高度
     */
    private Long notifyBlockNumber;

    /**
     * 通知结果
     */
    private String notityStatus;

    /**
     * 推送结果  如果不是成功,加下notify_num小于配置的次数,就一直推,
     */
    private String notifyResult;

    /**
     * 调用远程时的响应
     */
    private String notifyResponse;

    /**
     * 调用远程时携带的参数
     */
    private String notifyParam;

    /**
     * 响应唯一id
     */
    private String notifyRid;

    /**
     * 交易的唯一id由中心化定义，链上通知需要带上
     */
    private String transactionUuid;

    /**
     * 数据创建时间
     */
    private Date createTime;

    /**
     * 修改时间
     */
    private Date updatedTime;

   public UpChainQuery build() {
		String gasUsedNew = Optional.ofNullable(gasUsed).filter(Objects::nonNull)
				.map(x -> x.stripTrailingZeros().toPlainString()).orElse(null);
		return UpChainQuery.builder().id(clientId).sn(sn).status(status).transactionHash(transactionHash)
				.receiveTimestamp(receiveTimestamp).startUpChainTimestamp(startUpChainTimestamp)
				.eventUpChainTimestamp(eventUpChainTimestamp).address(address).gasUsed(gasUsedNew).build();
	}
}